package API.Class.util.ReadString;

import API.Class.util.StringPro;

import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 本类适用于格式化（格式${sth}）
 */
public class Formation {
    private Set<String> Name = null;//名称
    private final StringPro string;//修改的变量

    /**
     * 初始化，改变有效值格式为${sth}
     *
     * @param CastString 被转换字符串
     */
    public Formation(String CastString) {
        // 初始化 string 和 Name
        string = new StringPro(CastString);
        Name = new HashSet<>();

        // 使用正则表达式分割字符串，并提取以 "${" 开头并以 "}" 结尾的子字符串
        Pattern pattern = Pattern.compile("\\$\\{(.*?)}");
        Matcher matcher = pattern.matcher(CastString);
        while (matcher.find()) {
            Name.add(matcher.group());
        }
    }

    /**
     * 获取结果
     *
     * @return 获取结果，返回StringPro对象
     */

    public StringPro getResult() {
        return (StringPro) string.clone();
    }

    /**
     * 改变字符串
     *
     * @param revalued 改变其中文本（非${sth}格式）
     * @param value    改变它的值
     * @return
     */
    public void Change(String revalued, String value) {//revalued文本,value改变值
        if (Name == null & Name.isEmpty()) return;
        String cache;
        cache = string.toString();
        if (Name.contains("${" + revalued + "}")) {
            cache = cache.toString().replaceAll("\\$\\{" + revalued + "\\}", value);
        }
        string.clear();
        string.append(cache);

    }

    /**
     * 改变字符串
     *
     * @param revalued 改变其中文本（非${sth}格式）
     * @param value    改变它的值
     * @return
     */
    public void Change(String[] revalued, String value) {//revalued文本,value改变值
        if (Name == null & Name.isEmpty()) return;
        Iterator<String> iterable = StringPro.StringToList(revalued).iterator();
        String cache = "";
        while (iterable.hasNext()) {
            StringPro cache1 = null;
            cache = iterable.next();
            if (Name.contains("${" + cache + "}")) {
                cache1 = new StringPro(string.toString().replaceAll("\\$\\{" + revalued + "\\}", value));
                string.clear();
                string.append(cache1);
            }
        }
    }

    /**
     * @param c        修改某类的Class对象
     * @param variable 被改变类的变量名（区分大小写）
     * @param value    改变后的值
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public static void Revise(Class c, String variable, Object value) throws NoSuchFieldException, IllegalAccessException {//c为类，variable为被修改变量，value为修改的变量
        Field f = c.getDeclaredField(variable);//获取属性列表
        f.setAccessible(true);//设置为可修改
        f.set(variable, value);//将变量对应名称里面的值设置为指定值
    }

}
